package ar.edu.uade.fain.ad.test.server.dao.hibernate;

import javax.persistence.PersistenceException;

import org.hibernate.HibernateException;
import org.hibernate.Session;

import ar.edu.uade.fain.ad.test.server.business.ContratoBO;
import ar.edu.uade.fain.ad.test.server.business.ConvenioBO;
import ar.edu.uade.fain.ad.test.server.business.DesarrolladorBO;
import ar.edu.uade.fain.ad.test.server.business.ProyectoBO;
import ar.edu.uade.fain.ad.test.server.dao.ContratoDAO;
import ar.edu.uade.fain.ad.test.server.entity.Contrato;
import ar.edu.uade.fain.ad.test.server.entity.Desarrollador;

public class ContratoHibernateDAO implements ContratoDAO {

	@Override
	public ContratoBO buscarDesarrolladorConMayorConvenio() {
		final Session session = HibernateUtil.get().openSession();
		session.beginTransaction();
		try {
			final Contrato entity = 
					(Contrato) session
							.getNamedQuery("contrato.desarrolladorMayorConvenio")
									.uniqueResult();
			final ContratoBO bo = map(entity);
			session.getTransaction().commit();
			session.close();
			return bo;
		} catch (HibernateException he) {
			throw new PersistenceException(he);
		}
		
	}

	private ContratoBO map(final Contrato entity) {
		final ContratoBO bo = new ContratoBO();
		bo.setId(entity.getId());
		bo.setFecha(entity.getFecha());
		bo.setConvenio(new ConvenioBO());
		bo.getConvenio().setHoras(entity.getConvenio().getHoras());
		bo.getConvenio().setValorHora(entity.getConvenio().getValorHora());
		bo.setProyecto(new ProyectoBO());
		bo.getProyecto().setId(entity.getProyecto().getId());
		bo.getProyecto().setNombre(entity.getProyecto().getNombre());
		bo.getProyecto().setAnio(entity.getProyecto().getAnio());
		final DesarrolladorBO desarrolladorBO = new DesarrolladorBO();
		final Desarrollador desarrollador = (Desarrollador) entity.getIntegrante();
		desarrolladorBO.setId(desarrollador.getId());
		desarrolladorBO.setNombre(desarrollador.getNombre());
		desarrolladorBO.setEspecialidad(desarrollador.getEspecialidad());
		bo.setIntegrante(desarrolladorBO);
		return bo;
	}

}
